<?php
/**
 * 项目入口文件
 * @date    2016-09-21
 */
/**
 * 框架根目录
 */
define('Z_DIR', realpath('../../'));
require(Z_DIR . '/core/config/constant.php');
/**
 * 项目编码【指的是php程序的编码】
 */
define('Z_CHARSET_PROJECT', 'utf-8');
/**
 * 是否打开Debug状态
 */
define('Z_DEBUG', true);
/**
 * 当前环境，dev为开发环境，test为测试环境，live为生产环境
 */
//define('Z_ENV', 'live');
/**
 * 网站最顶级域名
 */
define('Z_TOP_SERVER', preg_replace('/^[^\.]+\./', '', $_SERVER['HTTP_HOST']));
/**
 * www 网站域名
 */
define('Z_TOP_WWW', strtolower($_SERVER['HTTP_HOST']));
/**
 * 当前项目所在文件夹
 */
define('Z_APP', __DIR__);
/**
 * 当前项目的模块文件夹
 */
define('Z_APP_MODELS', Z_APP . '/models');
/**
 * 核心模块文件夹
 */
define('Z_CORE_MODELS', Z_DIR . '/core/models');
/**
 * 日志文件夹
 */
define('Z_LOG_DIR', Z_APP . '/log');
/**
 * Sessions会话保存的文件夹，只有在用文件方式保存的时候才设置
 */
define('Z_SESSION_DIR', Z_DIR . '/tmp/session');
/**
 * 项目的cookie根目录
 */
define('Z_COOKIE_PATH', '/');
/**
 * 项目的cookie作用域，Cookie 的作用 域。 例如：“www.php.net”。 如果要让 cookie 在所有的子域中都可用，此参数必须以点（.）开头，例如：“.php.net”。
 */
define('Z_COOKIE_DOMAIN', '.' . Z_TOP_SERVER);
/**
 * 视图模板版本。此值在实际生产应用时你可以根据各样条件来判断并设定它的值。比如：pc 版、m 版，它与/views文件夹下面的目录名称对应
 * 如： if(stripos($_SERVER['HTTP_HOST'], 'www')===0){ define('Z_TPL_VERSION', 'pc'); };
 */
define('Z_TPL_VERSION', 'pc');
/**
 * smarty总开关
 */
define('Z_SMARTY_SWITCH', false);
/**
 * smarty路径
 */
define('Z_SMARTY_LIBS', Z_DIR . '/ext/smarty-3.1.27/libs');
/**
 * smarty模板路径
 */
define('Z_SMARTY_TEMPLATE_DIR', Z_APP . '/views');
/**
 * 模板左标签
 */
define('Z_SMARTY_DELIMITER_LEFT', '{{');
/**
 * 模板右标签
 */
define('Z_SMARTY_DELIMITER_RIGHT', '}}');
/**
 * smarty编译文件存放的目录
 */
define('Z_SMARTY_COMPILE_DIR', Z_DIR . '/tpl_c');
/**
 * 如果服务器php配置开启了自动转义功能就返回true，否则返回false
 */
if (floatval(phpversion()) < 5.4) { // 5.4.0 开始就始终返回false
    define('Z_MAGIC_QUOTES_GPC', (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) || @ini_get('magic_quotes_sybase'));
} else {
    define('Z_MAGIC_QUOTES_GPC',false);
}

# 如果出现500错误，可以打开下面两行看具体出错是什么 开始
#ini_set('display_errors', 1);
#error_reporting(E_ALL & ~(E_STRICT | E_NOTICE));
# 结束
class index {
    private $errorSwitch;

    public function __construct() {
        //配置参数
        require(Z_APP . '/config/config.php');
        $this->errorSwitch = config::DEBUG === true ? 1 : 0;
        // 打开错误显示
        ini_set('display_errors', $this->errorSwitch);
        //设置错误报告级别(E_ALL - 所有的错误和警告  ; E_ERROR - 致命性运行时错  ; E_WARNING - 运行时警告（非致命性错）; E_PARSE - 编译时解析错误  ; E_NOTICE - 运行时提醒(这些经常是是你的代码的bug引起的)
        error_reporting(E_ALL & ~(E_STRICT | E_NOTICE));
    }

    /**
     * 执行
     */
    public function run() {
        //自动载入类处理
        require(Z_CORE_MODELS . '/autoLoad.php');
        $auto_class_array = array('AutoLoad', 'AutoLoadClass');
        spl_autoload_register($auto_class_array);
        try {
            //配置参数
            //require(Z_APP . '/config/config.php');
            //网站唯一的一个全局变量设置
            $config = new \config();//Z_ENV
            //执行处理
            $A = new \Application($config);
            $A->run();
            //debug_print_backtrace();
            spl_autoload_unregister($auto_class_array);
        }catch (\core\models\Error $e){
            header('HTTP/1.1 404 Not Found');
            header('Status: 404 Not Found');
            $errors = array();
            $errors['errorTitle'] = '<h1>程序出错啦！Error!</h1>';

            if ($this->errorSwitch == 1) {
                $errors['errorContent'] = $e->getMessageHtml(false, (!in_array(\config_web::API_OUT_TYPE, array('json','xml'))) ? 'string' : 'array');
            } else {
                $logFile = Z_LOG_DIR . '/error.log';
                $e->outputToFile($logFile);
                $errors['errorContent'] = '具体错误请到后台查看。'.$logFile;
            }
            switch(\config_web::API_OUT_TYPE){
                case 'json':
                    header("Content-Type: application/json; charset=utf-8");
                    echo json_encode($errors, JSON_UNESCAPED_UNICODE);
                    break;
                case 'xml':
                    header("Content-Type: application/xml");
                    echo \Z::Arrays()->toXml($errors);
                    break;
                default:
                    header('content-type:text/html;charset=' . Z_CHARSET_PROJECT);
                    echo $errors['errorTitle'] .PHP_EOL;
                    echo $errors['errorContent'].PHP_EOL;
            }
        }catch (\Exception $e) {
            header('HTTP/1.1 404 Not Found');
            header('Status: 404 Not Found');
            if ($this->errorSwitch == 1) {
                $errors = array();
                $errors['errorMessage'] = $e->getMessage();
                $errors['errorDefault'] = print_r($e,true);
                switch(\config_web::API_OUT_TYPE){
                    case 'json':
                        header("Content-Type: application/json; charset=utf-8");
                        echo json_encode($errors, JSON_UNESCAPED_UNICODE);
                        break;
                    case 'xml':
                        header("Content-Type: application/xml");
                        echo \Z::Arrays()->toXml($errors);
                        break;
                    default:
                        header('content-type:text/html;charset=' . Z_CHARSET_PROJECT);
                        echo '<pre>';
                        echo $errors['errorMessage'];
                        echo \Z::Strings()->stringToHtmlEntitiles('详细如下：', Z_CHARSET_PROJECT);
                        echo '<hr />';
                        echo $errors['errorDefault'];
                        echo '</pre>';
                }
            } else {
                $logFile = Z_LOG_DIR . '/error.log';
                file_put_contents($logFile, 'DATE:' . date('Y-m-d H:i:s') . "\r\nErrorInfo:" . print_r($e, true) . "\r\n\r\n", FILE_APPEND);
            }
        }
    }
}

$I = new \index();
$I->run();
exit();

